package com.aura.lyngen.core;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.aura.lyngen.ai.model.HtmlCodeResult;
import com.aura.lyngen.ai.model.MultiFileCodeResult;
import com.aura.lyngen.model.enums.CodeGenTypeEnum;

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @ClassName CodeFileSaver
 * @Description 文件保存器
 * @Author ZJX
 * @Date 2025/8/30 18:46
 * @Version 1.0
 **/
public class CodeFileSaver {

    /**
     * 文件保存的根目录
     */
    private static final String WEB_DIR = System.getProperty("user.dir") + "/web/code_output";


    /**
     * 保存 HTML代码
     *
     * @param htmlCodeResult
     * @return
     */
    public static File saveHtmlCodeResult(HtmlCodeResult htmlCodeResult) {
        String uniqueDir = buildUniqueDir(CodeGenTypeEnum.HTML.getValue());
        writeContentToFile(uniqueDir, "index.html", htmlCodeResult.getHtmlCode());
        return new File(uniqueDir + "/index.html");
    }

    /**
     * 保存多文件网页代码
     *
     * @param result
     * @return
     */
    public static File saveMultiFileCodeResult(MultiFileCodeResult result) {
        String baseDirPath = buildUniqueDir(CodeGenTypeEnum.MULTI_FILE.getValue());
        writeContentToFile(baseDirPath, "index.html", result.getHtmlCode());
        writeContentToFile(baseDirPath, "style.css", result.getCssCode());
        writeContentToFile(baseDirPath, "script.js", result.getJsCode());
        return new File(baseDirPath);
    }

    /**
     * 构建文件的路径
     * 例如：HTML: web/code_output/html_当日时间_雪花 ID   时间精确到分钟
     * 例如：多文件: web/code_output/multi_file_当日时间_雪花 ID  时间精确到分钟
     * 雪花 ID 则使用其尾部几位进行区分。
     *
     * @param bizType 代码生成类型
     * @return 文件路径
     */
    private static String buildUniqueDir(String bizType) {
        String timeString = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm")); // 获取当前时间
        String snowString = IdUtil.getSnowflakeNextIdStr().substring(10, 16);// 获取雪花 ID 的后 6 位
        String uniqueDirName = StrUtil.format("{}_{}_{}", bizType, timeString, snowString);
        String dirPath = WEB_DIR + File.separator + uniqueDirName;  // 拼接目录路径
        FileUtil.mkdir(dirPath);  // 创建目录
        return dirPath;
    }

    /**
     * 将内容写入指定文件（若文件不存在则创建，若存在则覆盖）
     *
     * @param dirPath  目录路径（文件将被创建在此目录下）
     * @param filename 文件名（包含扩展名）
     * @param content  要写入的文件内容
     */
    private static void writeContentToFile(String dirPath, String filename, String content) {
        String filePath = dirPath + File.separator + filename;
        FileUtil.writeString(content, filePath, StandardCharsets.UTF_8);
    }

}
